package com.crawler.system.dto;

import lombok.Data;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

/**
 * 分页查询结果封装类
 *
 * @param <T> 数据类型
 */
@Data
public class PageResult<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 当前页码
     */
    private Integer pageNum;

    /**
     * 每页记录数
     */
    private Integer pageSize;

    /**
     * 总记录数
     */
    private Long total;

    /**
     * 总页数
     */
    private Integer pages;

    /**
     * 数据列表
     */
    private List<T> list;

    /**
     * 是否有上一页
     */
    private Boolean hasPrevious;

    /**
     * 是否有下一页
     */
    private Boolean hasNext;

    public PageResult() {
    }

    /**
     * 构造方法
     *
     * @param pageNum  当前页码
     * @param pageSize 每页记录数
     * @param total    总记录数
     * @param list     数据列表
     */
    public PageResult(Integer pageNum, Integer pageSize, Long total, List<T> list) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
        
        // 计算总页数
        if (pageSize > 0) {
            this.pages = (int) Math.ceil((double) total / pageSize);
        } else {
            this.pages = 0;
        }
        
        // 计算是否有上一页
        this.hasPrevious = pageNum > 1;
        
        // 计算是否有下一页
        this.hasNext = pageNum < pages;
    }

    /**
     * 构造方法
     *
     * @param pageNum     当前页码
     * @param pageSize    每页记录数
     * @param total       总记录数
     * @param pages       总页数
     * @param list        数据列表
     * @param hasPrevious 是否有上一页
     * @param hasNext     是否有下一页
     */
    public PageResult(Integer pageNum, Integer pageSize, Long total, Integer pages, List<T> list, Boolean hasPrevious, Boolean hasNext) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.pages = pages;
        this.list = list;
        this.hasPrevious = hasPrevious;
        this.hasNext = hasNext;
    }

    /**
     * 创建空的分页结果
     *
     * @param <T> 数据类型
     * @return 空的分页结果
     */
    public static <T> PageResult<T> empty() {
        return new PageResult<>(1, 10, 0L, 0, Collections.emptyList(), false, false);
    }
} 
